import {post} from "./api";
import {onLoad, onShow} from "@dcloudio/uni-app";
import {ref} from "vue";

/**
 * 查询单条数据
 * @param {string} model - 数据模型名称
 * @param {object} param - 查询参数对象，可选
 * @returns {Promise} 返回API请求的Promise对象
 */
export const one = (model, param) => {
    let req = {};
    req.model = model;
    req.filters = param||{};
    return post("/data/selectOne", req);
}

/**
 * 查询数据列表
 * @param {string} model - 数据模型名称
 * @param {object} param - 查询参数对象，可选
 * @returns {Promise} 返回API请求的Promise对象
 */
export const list = (model, param) => {
    let req = {};
    req.model = model;
    req.filters = param||{};
    return post("/data/list", req);
}

/**
 * 加载单条数据并更新ref引用
 * @param {string} model - 数据模型名称
 * @param {object} param - 查询参数对象
 * @param {ref} ref - Vue3的ref引用对象，用于存储查询结果
 */
export const loadData = async (model, param, ref) => {
    let res = await one(model, param);
    if (res.code === 200) {
        ref.value = res.data || {};
    }
}

/**
 * 加载数据列表并更新ref引用
 * @param {string} model - 数据模型名称
 * @param {object} param - 查询参数对象
 * @param {ref} ref - Vue3的ref引用对象，用于存储查询结果列表
 */
export const loadList = async (model, param, ref) => {
    let res = await list(model, param);
    if (res.code === 200) {
        ref.value = res.data || [];
    }
}

/**
 * 在页面加载时获取单条数据的Hook函数
 * @param {string} model - 数据模型名称
 * @param {object|ref} searchObject - 查询参数对象或ref引用
 * @returns {object} 返回包含data和refresh方法的对象
 */
export function useLoadData(model, searchObject) {
    //集合
    let data = ref({})
    const refresh = handleOneRequest(searchObject, model, data);

    onLoad(async () => {
        await refresh();
    })
    return {
        data,refresh
    }
}

/**
 * 在页面加载时获取数据列表的Hook函数
 * @param {string} model - 数据模型名称
 * @param {object|ref} searchObject - 查询参数对象或ref引用
 * @returns {object} 返回包含listData和refresh方法的对象
 */
export function useLoadList(model, searchObject) {
    //集合
    let listData = ref([])
    const refresh = handleListRequest(searchObject, model, listData);

    onLoad(async () => {
        await refresh();
    })
    return {
        listData,refresh
    }

}

/**
 * 处理单条数据请求的内部函数
 * @param {object|ref} searchObject - 查询参数对象或ref引用
 * @param {string} model - 数据模型名称
 * @param {ref} data - 用于存储结果的ref引用
 * @returns {Function} 返回异步刷新函数
 */
function handleOneRequest(searchObject, model, data) {

    return async () => {
        let param
        if (searchObject===null){
            searchObject = {};
        }
        if (searchObject.value) {
            param = searchObject.value
        } else {
            param = searchObject;
        }
        let res = await one(model, param);
        if (res.code !== 200) {
            return;
        }
        data.value = res.data;
    };
}

/**
 * 处理数据列表请求的内部函数
 * @param {object|ref} searchObject - 查询参数对象或ref引用
 * @param {string} model - 数据模型名称
 * @param {ref} data - 用于存储结果的ref引用
 * @returns {Function} 返回异步刷新函数
 */
function handleListRequest(searchObject, model, data) {

    return async () => {
        let param
        if (searchObject===null){
            searchObject = {};
        }
        if (searchObject.value) {
            param = searchObject.value
        } else {
            param = searchObject;
        }
        let res = await list(model, param);
        if (res.code !== 200) {
            return;
        }
        data.value = res.data;
    };
}

/**
 * 在页面显示时获取单条数据的Hook函数
 * @param {string} model - 数据模型名称
 * @param {object|ref} searchObject - 查询参数对象或ref引用
 * @returns {object} 返回包含data和refresh方法的对象
 */
export function useShowData(model, searchObject) {
    //集合
    let data = ref({})
    const refresh = handleOneRequest(searchObject, model, data);
    onShow(async () => {
        await refresh();
    })
    return {
        data,refresh
    }
}

/**
 * 在页面显示时获取数据列表的Hook函数
 * @param {string} model - 数据模型名称
 * @param {object|ref} searchObject - 查询参数对象或ref引用
 * @returns {object} 返回包含listData和refresh方法的对象
 */
export function useShowList(model, searchObject) {
    //集合
    let listData = ref([])
    const refresh = handleListRequest(searchObject, model, listData);
    onShow(async () => {
        await refresh();
    })
    return {
        listData,refresh
    }
}

